package com.wgzx.modbus.entity.response;

import com.wgzx.modbus.constant.FunctionCode;
import com.wgzx.modbus.entity.ModbusRsp;
import io.netty.buffer.ByteBuf;
import lombok.Getter;

import java.util.BitSet;

/**
 * 请求报文：<br/>
 * 功能码：(0x02)读离散量输入 <br/>
 * 起始地址：2个字节0x0000至0xFFFF <br/>
 * 输入数量：2个字节0x01至0x07D0(这里请求的是bit位的数量) <br/>
 *
 * 响应报文：<br/>
 * 功能码：1个字节0x02 <br/>
 * 字节数：1个字节N <br/>
 * 输入状态：N个字节 <br/>
 * N＝输出数量/8，如果余数不等于0，那么N=N+1(请求10个bit位，如果不是8的倍数，则需要+1) <br/>
 *
 * 错误响应：<br/>
 * 差错码：1个字节0x82 <br/>
 * 异常码：1个字节01或02或03或04 <br/>
 *
 * 示例报文：
 * Rx:00 01(事务ID) 00 00(协议) 00 06(长度) FF(单元标识符) 02(功能码) 00 00(偏移量) 00 0A(请求数据数量[bit个数]) <br/>
 * Tx:00 01(事务ID) 00 00(协议) 00 05(长度) FF(单元标识符) 02(功能码) 02(数据长度) 09 01(返回数据) <br/>
 * 0x09=0000,1001  0x01=0000,0001  按字节顺序低位在前开始排列，正好是0,3,8位置比特位为1. <br/>
 * ReadDiscreteInputsResponse{byteCount=2, coilStatus={0, 3, 8}} <br/>
 *
 * @author gexin
 */
@Getter
public class ReadDiscreteInputsResponse extends ModbusRsp {

    private short byteCount;
    private BitSet inputStatus;

    public ReadDiscreteInputsResponse(FunctionCode functionCode) {
        super(functionCode);
    }

    @Override
    public void decode(ByteBuf data) {
        //读取数据长度
        byteCount = data.readUnsignedByte();

        //解码出数据
        byte[] inputs = new byte[byteCount];
        data.readBytes(inputs);

        //转为bitset位图
        inputStatus = BitSet.valueOf(inputs);
    }

    @Override
    public String toString() {
        return "ReadDiscreteInputsResponse{" + "byteCount=" + byteCount + ", coilStatus=" + inputStatus + '}';
    }
}
